// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.search.viewholder;

import android.text.SpannableStringBuilder;
import android.view.View;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.IMClientManager;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rainbowchat.http.logic.dto.TimeToolKit;
import com.x52im.rbchat.logic.alarm.AlarmType;
import com.x52im.rbchat.logic.alarm.model.AlarmDto;
import com.x52im.rbchat.logic.search.content.MsgDetailContent;
import com.x52im.rbchat.logic.search.model.MsgDetailContentDTO;

import androidx.fragment.app.Fragment;

/**
 * 消息记录（不聚合显示，有多少条就直接显示每条消息内容）item的viewHolder对象实现类。
 *
 * @author JackJiang
 * @since 8.2
 */
public class MsgDetailViewHolder extends AbstractViewHolder<MsgDetailContentDTO> {

    /** 时间显示组件 */
    protected TextView tvDateDesc;

    public MsgDetailViewHolder(Fragment fragment, View itemView) {
        super(fragment, itemView);
        this.tvDateDesc = itemView.findViewById(R.id.search_result_item_dateView);
    }

    /**
     * 用于RecycleView的adapter中的onBindViewHolder方法。
     *
     * @param keyword    本次搜索的关键字（用于ui显示时的高亮显示）
     * @param m          列表item对应的数据对象引用
     * @param showCatlog 是否显示item上方的标题文本（true表示显示，否则不显示）
     */
    @Override
    public void onBind(String keyword, MsgDetailContentDTO m, boolean showCatlog) {

        // 设置catlog的可见性
        itemView.findViewById(R.id.search_result_item_categoryLL).setVisibility(showCatlog?View.VISIBLE:View.GONE);
        tvCatlog.setText(showCatlog? MsgDetailContent.CATLOG:null);


        /*----------- 以下逻辑用于实现，当存在好友备注的情况下，如果是原昵称匹配了关键字，则要同时显示原昵称，否则不显示 START -----------*/

        tvDateDesc.setText(TimeToolKit.getTimeStringAutoShort2(TimeToolKit.getDateTime(m.getDate()), false, false));
        // 高亮显示关键字
        SpannableStringBuilder ssb = WidgetUtils.coloredStringForSearch(this.fragment.getContext(), m.getText(), keyword, R.color.common_list_light_red_for_text);
        tvMoreDesc.setText(ssb != null? ssb : m.getText());

        // 通过clear()或通过Glide.with(context).load(默认占位图的资源id)两种方式都可以解决错乱问题
        Glide.with(fragment).clear(ivAvatar);// 解决方法2

//        if(m.getChatType() == MsgSummarySearchResult.SEARCH_RESULT_CHAT_TYPE_SINGLE)
        {

            // clear完成后设置默认占位图，确保图片显示不出现Glide导致的错位问题
            ivAvatar.setImageResource(R.drawable.default_avatar_for_contact_40dp_21pxround);

            String senderUid = m.getSenderId();
            String nickname = m.getSenderDisplayName();

            IMClientManager imc = MyApplication.getInstance2().getIMClientManager();
            RosterElementEntity localUserInfo = imc.getLocalUserInfo();
            // 发消息的人是"我"
            boolean isMe = imc.isLocalUser(senderUid);

            boolean dontDiskCache = false;
            // 用户的头像文件名（这个文件名目前仅用于Glide缓存图片时作为signature字段使用）
            String fileNameForUserAvatar = null;
            if (senderUid != null) {
                if(isMe){
                    if(localUserInfo != null){
                        fileNameForUserAvatar = localUserInfo.getUserAvatarFileName();
                        nickname = localUserInfo.getNickname();
                    }
                } else {
                    // 尝试从好友数据中读取对方信息
                    final RosterElementEntity friendRee = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(senderUid);
                    // 好友信息不为空，表示对方是好友
                    if (friendRee != null) {
                        fileNameForUserAvatar = friendRee.getUserAvatarFileName();
                        nickname = friendRee.getNickNameWithRemark();

                        // 该字段为空可能是该用户没有设置头像，也可能是有可能是对方已把"我"删除，因而对方不在我
                        // 的好友列表里了，所以好友数据不存在，头像文件名也就取不到了，这种情况取头像时，就把它当陌生人聊
                        // 天模式去取头像，即dontDiskCache为true——确保相同url情况下至少app重启后能强行拉取一次最新头像
                        if (CommonUtils.isStringEmpty(fileNameForUserAvatar, true)) {
                            dontDiskCache = true;
                        }
                    }
                    // 对方不是好友（陌生人聊天）
                    else {
                        // 因陌生人没有好友信息缓存，所以尝试从首页"消息"列表中查找缓存
                        AlarmDto d = MyApplication.getInstance2().getIMClientManager().getAlarmsProvider().getAlarmDto(AlarmType.guestChat, senderUid);
                        // 对于陌生人来说，extra1String中，存放的就是可能最新头像文件名（在查看最新用户资料时设置进来的）
                        fileNameForUserAvatar = (d != null?d.getExtraString1():null);

                        // 陌生人昵称
                        nickname = MsgSummaryViewHolder.tryGetGustNickname(senderUid);

                        dontDiskCache = true;
                    }
                }

                // 加载用户头像(有头像文件名fileNameForUserAvatar作为Glide加载时的signature，可以保证在好友更改头像后，能及时加载到最新图片)
                ImageCacheLoader.loadAvatarImgWithGlide(fragment, senderUid, fileNameForUserAvatar
                        ,ivAvatar, 7 // 圆角单位是dp，（相当于xxhdpi下的21像素）
                        , R.drawable.default_avatar_for_contact_40dp_21pxround, dontDiskCache, false);
            }

            // 显示昵称
            tvName.setText(nickname);
        }
    }
}
